package org.goodsmanager.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.goodsmanager.common.Result;
import org.goodsmanager.entity.Category;
import org.goodsmanager.service.CategoryService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * 分类Controller
 *
 * @author Goods Manager System
 * @version 1.0.0
 */
@Slf4j
@Controller
@RequestMapping("/category")
@RequiredArgsConstructor
public class CategoryController {

    private final CategoryService categoryService;

    /**
     * 分类列表页面
     * 路由：GET /category/list.html
     * 返回：category/list.html 模板页面
     */
    @GetMapping("/list")
    public String listPage(Model model) {
        try {
            // 查询所有分类（包含商品数量统计）
            List<Category> categories = categoryService.getAllCategories();

            // 添加到模型，传递给前端页面
            model.addAttribute("categories", categories);

            // 返回模板视图名称
            return "category/list";

        } catch (Exception e) {
            log.error("查询分类列表失败", e);
            model.addAttribute("error", "查询分类列表失败: " + e.getMessage());
            return "error";
        }
    }

    /**
     * 获取所有分类（API接口）
     * 路由：GET /category/all
     * 返回：JSON格式的分类列表
     */
    @GetMapping("/all")
    @ResponseBody
    public Result<List<Category>> getAllCategories() {
        try {
            List<Category> categories = categoryService.getAllCategories();
            return Result.success(categories);
        } catch (Exception e) {
            log.error("查询分类列表失败", e);
            return Result.error("查询分类列表失败: " + e.getMessage());
        }
    }

    /**
     * 获取启用的分类（API接口）
     * 路由：GET /category/active
     * 返回：JSON格式的启用分类列表
     * 用途：商品表单中的分类下拉框
     */
    @GetMapping("/active")
    @ResponseBody
    public Result<List<Category>> getActiveCategories() {
        try {
            List<Category> categories = categoryService.getActiveCategories();
            return Result.success(categories);
        } catch (Exception e) {
            log.error("查询启用分类失败", e);
            return Result.error("查询启用分类失败: " + e.getMessage());
        }
    }

    /**
     * 根据ID查询分类（API接口）
     * 路由：GET /category/get/{id}
     * 参数：id - 分类ID
     * 返回：JSON格式的分类详情
     * 用途：编辑分类时获取分类信息
     */
    @GetMapping("/get/{id}")
    @ResponseBody
    public Result<Category> getCategoryById(@PathVariable String id) {
        try {
            Category category = categoryService.getCategoryById(id);

            if (category != null) {
                return Result.success(category);
            } else {
                return Result.error("分类不存在");
            }

        } catch (Exception e) {
            log.error("查询分类失败，ID: {}", id, e);
            return Result.error("查询分类失败: " + e.getMessage());
        }
    }

    /**
     * 新增分类（API接口）
     * 路由：POST /category/add
     * 请求体：JSON格式的Category对象
     * 返回：操作结果
     */
    @PostMapping("/add")
    @ResponseBody
    public Result<String> addCategory(@Valid @RequestBody Category category,
                                      BindingResult bindingResult) {
        try {
            // 验证参数
            if (bindingResult.hasErrors()) {
                String errorMsg = bindingResult.getFieldError().getDefaultMessage();
                return Result.error(400, errorMsg);
            }

            // 调用Service层添加分类
            boolean success = categoryService.addCategory(category);

            if (success) {
                log.info("新增分类成功: {}", category.getCategoryName());
                return Result.success("新增分类成功", category.getId());
            } else {
                log.warn("新增分类失败，可能编码或名称重复: {}", category.getCategoryCode());
                return Result.error("新增分类失败，编码或名称可能已存在");
            }

        } catch (Exception e) {
            log.error("新增分类失败", e);
            return Result.error("新增分类失败: " + e.getMessage());
        }
    }

    /**
     * 更新分类（API接口）
     * 路由：PUT /category/update
     * 请求体：JSON格式的Category对象（必须包含id）
     * 返回：操作结果
     */
    @PutMapping("/update")
    @ResponseBody
    public Result<String> updateCategory(@Valid @RequestBody Category category,
                                         BindingResult bindingResult) {
        try {
            // 验证参数
            if (bindingResult.hasErrors()) {
                String errorMsg = bindingResult.getFieldError().getDefaultMessage();
                return Result.error(400, errorMsg);
            }

            // 验证ID是否存在
            if (category.getId() == null || category.getId().isEmpty()) {
                return Result.error(400, "分类ID不能为空");
            }

            // 调用Service层更新分类
            boolean success = categoryService.updateCategory(category);

            if (success) {
                log.info("更新分类成功: {}", category.getCategoryName());
                return Result.success("更新分类成功");
            } else {
                log.warn("更新分类失败，可能编码或名称重复: {}", category.getCategoryCode());
                return Result.error("更新分类失败，编码或名称可能已被使用");
            }

        } catch (Exception e) {
            log.error("更新分类失败", e);
            return Result.error("更新分类失败: " + e.getMessage());
        }
    }

    /**
     * 删除分类（API接口）
     * 路由：DELETE /category/delete/{id}
     * 参数：id - 分类ID
     * 返回：操作结果
     * 注意：如果分类下有商品，则不允许删除
     */
    @DeleteMapping("/delete/{id}")
    @ResponseBody
    public Result<String> deleteCategory(@PathVariable String id) {
        try {
            // 调用Service层删除分类
            boolean success = categoryService.deleteCategory(id);

            if (success) {
                log.info("删除分类成功，ID: {}", id);
                return Result.success("删除分类成功");
            } else {
                log.warn("删除分类失败，该分类下可能有商品或不存在，ID: {}", id);
                return Result.error("删除失败，该分类下有商品或不存在");
            }

        } catch (Exception e) {
            log.error("删除分类失败，ID: {}", id, e);
            return Result.error("删除分类失败: " + e.getMessage());
        }
    }
}